//
// Created by martin on 8/3/21.
//

#ifndef FTPSERVER2_0_DIR_H
#define FTPSERVER2_0_DIR_H

/* 系统限制默认推测值 */
#define NAME_MAX_GUESS 255 /* 不包含null byte */
#define PATH_MAX_GUESS 256 /* 包含 null byte */
#define GETPW_R_SIZE_MAX_GUESS 4096 /* 包含 null byte */
#define GETGR_R_SIZE_MAX_GUESS 4096 /* 包含 null byte */

#include "config.h"
#include "ef_string.h"

/**
 * FTP directory模块
 * @note1
 * cwd_phy = rd_phy - "/" + cwd_vir
 * i.g. rd_phy = "/home/", cwd_vir = "/ftp/"
 * cwd_phy = /home/ftp/
 */
typedef struct dir{
    char *rd_phy; /* root directory 物理目录, 以"/"开头、结尾 */
    char *cwd_vir; /* current working directory（cwd）的虚拟路径（virtual path）, 以"/"开头、结尾 */
}Dir;

Dir* dir_new(const char *root_phy);
void dir_free(Dir *dir);

void dir_print(Dir *dir);

/**
 * 获取文件路径
 */
int dir_getPath(Dir *dir, const char *file_path, char *buf, size_t size);

/**
 * 获取指定文件路径file_path的物理路径，并将结果保存到buf中
 */
int dir_getPhysicalPath(Dir *dir, const char *file_path, char *buf, size_t size);

/**
 * 获取父目录路径
 */
int dir_getParent(Dir *dir, const char *path, char buf, size_t size);

/**
 * 获取文件大小(字节数）
 */
ssize_t dir_getFileSize(Dir *dir, const char *file_path);

/**
 * 判断文件是否存在
 */
int dir_exist(Dir *dir, const char *file_path);

/**
 * 判断是否为普通文件
 */
int dir_isRegFile(const char *file_path);

/**
 * 判断是否为目录文件
 */
int dir_isDir(Dir *dir, const char *file_path);

/**
 * 重命名文件
 */
int dir_rename(Dir *dir, const char *old_path, const char *new_path);

/**
 * 获取当前目录路径
 */
char *dir_getCWD(Dir *dir, char *buf, size_t size);

/**
 * 获取当前目录的绝对路径
 */
char *dir_getCWDPhysicalPath(Dir *dir, char *buf, size_t size);

/**
 * 切换当前目录至指定路径
 */
int dir_chdir(Dir *dir, const char *path);

/**
 * 获取指定目录下的子文件列表
 */
int dir_listFiles(Dir *dir, struct ef_string *s);

#endif //FTPSERVER2_0_DIR_H
